#pragma once

#include<iostream>
#include<algorithm>
using namespace std;

class MyString
{
public:
	MyString() {}
	MyString(const char* arr)
		:Msize(0),Mcapacity(4),Mstr(nullptr)
	{
		//cout << arr << endl;

		Msize = strlen(arr);//求长度
		//cout << strlen(arr) << endl;

		while (Mcapacity < Msize) Mcapacity *= 2;//二倍扩容

		Mstr = new char[ sizeof(char) * Mcapacity];

		//strlen计算的是他的长度，没有计算他的'\0'，所以在进行拷贝的时候
		// 一定要将最后的'\0'拷贝过来，给Msize+1进行拷贝
		//memcpy(Mstr, arr, Msize * sizeof(char));
		memcpy(Mstr, arr, (Msize + 1) * sizeof(char));
		
		//cout << strlen(Mstr) << endl;
	}
	//优先使用初始化列表进行初始化
	MyString(const MyString& str)
		:Msize(0), Mcapacity(4), Mstr(nullptr)
	{
		Msize = str.Msize;
		Mcapacity = str.Mcapacity;
		Mstr = new char[sizeof(char) * Mcapacity];
		memcpy(Mstr, str.Mstr, sizeof(char) *(Msize+1));
		//指针和数组还是不一样的
		//sizeof指针==4
		//sizeof数组==数组的大小
	}

	friend ostream& operator<<(ostream& out, MyString& str);
	friend istream& operator>>(istream& in, MyString& str);

	//返回字符串长度
	int size();
	int length();

	char operator[](const int pos);

	void operator=(const MyString& other);
	MyString operator+(const MyString& other);
	MyString& operator+=(const MyString& other);
	MyString& operator+=(const char ch);
	MyString& operator+= (const char* str);

public:
	int Msize ;//实际空间
	int Mcapacity ;//总空间
	char* Mstr;
};

ostream& operator<<(ostream& out, MyString& str);
istream& operator>>(istream& in, MyString& str);
